package model;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author João Gonçalves
 * @author Eventon Silva
 */
public class Arquivo {

    /**
     * Método responsável pelo leitura do arquivo do disco e por carregar os
     * dados em um Array em forma de processos. * @param arquivo É o arquivo
     * recebido.
     * @return Um lista de processos.
     * @throws FileNotFoundException Erro lançado ao não encontrar o arquivo
     * passado.
     */
    public static ArrayList<Processo> carregarArquivo(String arquivo) {

        ArrayList<Processo> listaProcessos = new ArrayList<>();

        // Leitura e carregamento do arquivo
        FileReader fileReader;
        Scanner scanner;
        try {
            fileReader = new FileReader(arquivo);
            scanner = new Scanner(fileReader);

            /*
             * Lendo e registrando cada linha do arquivo em 
             * forma de processo para uma lista de processos.
             */
            while (scanner.hasNextInt()) {

                int dataCriacao = scanner.nextInt();
                int duracao = scanner.nextInt();
                int prioridade = scanner.nextInt();

                // Adiciona o novo processo a lista de processos
                listaProcessos.add(new Processo(dataCriacao, duracao, prioridade));
            }

            /*
             * Fechando recursos para enconomizar memória.
             */
            scanner.close();
            try {
                fileReader.close();
            } catch (IOException ex) {
                Logger.getLogger(Arquivo.class.getName()).log(Level.SEVERE, null, ex);
            }

        } catch (FileNotFoundException fnfe) {
            System.out.println(fnfe);
        }

        /**
         * Ordenação da lista de processos de acordo com o data(tempo) de
         * criação do processo. Evitando que haja erros na sequencia de execução
         * dos processos.
         */
        Collections.sort(listaProcessos);

        return listaProcessos;
    }
}